package com.example.demo.controller.process;

import com.example.demo.commom.AjaxResult;
import com.example.demo.commom.TokenUtil;
import com.example.demo.dto.process.AddCourseDto;
import com.example.demo.entity.user.Student;
import com.example.demo.service.process.CourseService;
import com.example.demo.service.user.AdminService;
import com.example.demo.service.user.ParentService;
import com.example.demo.service.user.StudentService;
import com.example.demo.service.user.TeacherService;
import com.example.demo.vo.process.CourseVo;
import com.example.demo.vo.process.PCourseVo;
import com.example.demo.vo.user.UserInfoVo;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

@RestController
@RequestMapping("/course")
public class CourseController {
    @Autowired
    private CourseService courseService;
    @Autowired
    private TeacherService teacherService;
    @Autowired
    private AdminService adminService;
    @Autowired
    private ParentService parentService;
    @Autowired
    private StudentService studentService;

    // 新增课程信息
    @PostMapping("/add")
    public AjaxResult addCourse(HttpServletRequest request, @RequestBody AddCourseDto addCourseDto){
        // 判断教师身份
        Integer userId = TokenUtil.getIdByToken(request.getHeader("token"));
        if(userId == null || userId < 2000 || userId > 5000 || !teacherService.authentication(userId)){
            return AjaxResult.fail("参数有误");
        }
        // 参数校验
        String add_check = addCourseDto.checkOut();
        if(add_check.isBlank()){
            return AjaxResult.fail(add_check);
        }
        // 校验待添加的课程信息中教师是否真实存在
        if(!teacherService.authentication(addCourseDto.getTeacher_id())){
            return AjaxResult.fail("课程中教师编号有误");
        }
        return AjaxResult.success(courseService.add(addCourseDto));
    }


    /**
     * 查询课程信息
     * # 管理员
     * 1、查看所有课程信息
     * 2、查看指定班级课程信息
     * 3、查看指定班级的指定学期的课程信息
     * 4、查看指定学生的课程信息
     * 5、查看指定学生的指定学期的课程信息
     * # 教师
     * 1、和管理员一样
     * # 学生
     * 1、查看自己所有课程信息
     * 2、查看自己指定学期的课程信息
     * # 家长
     * 1、查看自己所有孩子的所有课程信息
     * 2、查看自己指定孩子的所有课程信息
     * 3、查看自己所有孩子的指定学期的课程信息
     * 4、查看自己指定孩子的指定学期的课程信息
     * @param request
     * @param identity
     * @param class_id
     * @param semester
     * @param student_id
     * @return
     */
    @GetMapping("/info")
    public AjaxResult getCourse(HttpServletRequest request, Integer identity, Integer class_id,
                                Integer semester, Integer student_id) {
        if(identity == null){
            return AjaxResult.fail("参数有误");
        }
        Integer user_id = TokenUtil.getIdByToken(request.getHeader("token"));
        if(user_id == null){
            return AjaxResult.fail("参数有误");
        }
        if(identity == 0){
            // 验证管理员的身份
            if(!adminService.authentication(user_id)){
                return AjaxResult.fail("管理员身份有误");
            }
        }
        if(identity == 1){
            // 验证教师的身份
            if(!teacherService.authentication(user_id)){
                return AjaxResult.fail("教师身份有误");
            }
        }
        if(identity == 0 || identity == 1){
            //1、查看所有课程信息
            //2、查看指定班级课程信息
            //3、查看指定班级的指定学期的课程信息
            //4、查看指定学生的所有课程信息
            //5、查看指定学生的指定学期的课程信息
            if(class_id != null){
                if(semester != null){
                    // 查看指定班级的指定学期的课程信息
                    return AjaxResult.success(courseService.getCourseByClassIdAndSemester(class_id, semester));
                }
                // 查看指定班级课程信息
                return AjaxResult.success(courseService.getCourseByClassId(class_id));
            } else if(student_id != null){
                if(semester != null){
                    // 查看指定学生的指定学期的课程信息
                    return AjaxResult.success(courseService.getCourseByStudentIdAndSemester(student_id, semester));
                }
                // 查看指定学生的所有课程信息
                return AjaxResult.success(courseService.getCourseByStudentId(student_id));
            }
            return AjaxResult.success(courseService.getCourseAll());
        }
        if(identity == 2){
            // 验证学生身份
            if(!studentService.authentication(user_id)){
                return AjaxResult.fail("学生身份有误");
            }
            if(semester != null){
                // 查看指定学生的指定学期的课程信息
                return AjaxResult.success(courseService.getCourseByStudentIdAndSemester(user_id, semester));
            }
            // 查看指定学生的所有课程信息
            return AjaxResult.success(courseService.getCourseByStudentId(user_id));
        }
        if(identity == 3){
            // 验证家长身份
            if(!parentService.authentication(user_id)){
                return AjaxResult.fail("家长身份有误");
            }
            // 1、查看自己所有孩子的所有课程信息
            // 2、查看自己指定孩子的所有课程信息
            // 3、查看自己所有孩子的指定学期的课程信息
            // 4、查看自己指定孩子的指定学期的课程信息
            List<PCourseVo> pCourseVos = new ArrayList<>();
            if(student_id != null){
                PCourseVo pCourseVo = new PCourseVo();
                List<UserInfoVo> studentInfo = studentService.getStudentInfo(student_id, null, null);
                pCourseVo.setStudent_id(studentInfo.get(0).getUser_id());
                pCourseVo.setUsername(studentInfo.get(0).getUsername());
                List<CourseVo> tmp = new ArrayList<>();
                if(semester != null){
                    // 查看自己指定孩子的指定学期的课程信息
                    tmp = courseService.getCourseByStudentIdAndSemester(student_id, semester);
                } else {
                    // 查看自己指定孩子的所有课程信息
                    tmp = courseService.getCourseByStudentId(student_id);
                }
                pCourseVo.setCourseVo(tmp);
                pCourseVos.add(pCourseVo);
                return AjaxResult.success(pCourseVos);
            }
            // 查询自己有多少个孩子
            List<UserInfoVo> infoVos = parentService.getParentById(user_id);
            // 查询名下所有学生信息
            String student_array = infoVos.get(0).getStudent_array();
            String[] student_ids = student_array.split(",");
            // 根据不同的学生id来分看查看
            if(semester != null){
                for(String id : student_ids){
                    PCourseVo pCourseVo = new PCourseVo();
                    // 遍历自己所有孩子指定学期课程信息
                    List<UserInfoVo> studentInfo = studentService.getStudentInfo(Integer.valueOf(id), null, null);
                    pCourseVo.setStudent_id(studentInfo.get(0).getUser_id());
                    pCourseVo.setUsername(studentInfo.get(0).getUsername());

                    List<CourseVo> tmp = courseService.getCourseByStudentIdAndSemester(Integer.valueOf(id), semester);
                    pCourseVo.setCourseVo(tmp);
                    pCourseVos.add(pCourseVo);
                }
            } else {
                for(String id : student_ids){
                    PCourseVo pCourseVo = new PCourseVo();
                    // 遍历查看自己所有孩子的所有课程信息
                    List<UserInfoVo> studentInfo = studentService.getStudentInfo(Integer.valueOf(id), null, null);
                    pCourseVo.setStudent_id(studentInfo.get(0).getUser_id());
                    pCourseVo.setUsername(studentInfo.get(0).getUsername());

                    List<CourseVo> tmp = courseService.getCourseByStudentId(Integer.valueOf(id));
                    pCourseVo.setCourseVo(tmp);
                    pCourseVos.add(pCourseVo);
                }
            }
            return AjaxResult.success(pCourseVos);
        }
        return AjaxResult.fail("参数有误");
    }
}